package basis.idnr;

import java.io.Serializable;


/**
 * Die Klasse ISSN bietet die Moeglichkeit ISBN-Nummern standardkonform
 * abzuspeichern und auszugeben.
 * 
 * Datei: ISSN.java                   
 * Datum: 06.11.2011   
 *                  
 * @author Alexander Bredo 
 * @version 0.1
 */
public class ISSN extends Identifikationsnummer implements Serializable 
{
  private static final long serialVersionUID = -887962003450847076L;
  private long issn;

  
  /**
   * Erstellt ein neues Objekt anhand einer ISSN-Zeichenfolge
   */
  public ISSN (String issn) throws IllegalArgumentException
  {
    setzeISSN (issn);
  }

  
  /**
   * Erstellt ein neues Objekt anhand einer ISSN-Zahl
   */
  public ISSN (long issn) throws IllegalArgumentException
  {
    setzeISSN (issn);
  }


  public long toLong ()
  {
    return issn;
  }


  /**
   * Gibt die ISSN standardkonform aus.
   */
  public String toString ()
  {
    return gibZahlMitFuehrenderNull (issn, gibGueltigeLaenge ());
  }


  /**
   * Prueft die Gueltigkeit einer ISSN anhand der Laenge und Pruefziffer
   */
  public boolean istGueltig (String issn)
  {
    return istGueltig (gibZahl (issn));
  }
  
  
  /**
   * Prueft die ISBN-Zeichenfolge auf Uebereinstimmung mit der 
   * Pruefsumme und auf ihre Laenge
   */
  public boolean istGueltig (long issn)
  {
    if (gibBerechnetePruefziffer (issn) == issn % 10)
    {
      return true;
    }
    else
    {
      return false;
    }
  }


  /**
   * Prueft 2 ISSN-Nummern auf Gleichheit
   */
  public boolean istIdentisch (ISSN issn)
  {
    return this.issn == issn.toLong ();
  }


  /**
   * Setzt eine ISSN per Zeichenfolge
   */
  public void setzeISSN (String issn) throws IllegalArgumentException
  {
    setzeISSN (gibZahl (issn));
  }


  /**
   * Setzt eine ISSN als Nummer
   */
  public void setzeISSN (long issn)
  {
    if (!istGueltigeLaenge (issn))
    {
      throw new IllegalArgumentException (
          "Die ISSN hat nicht die richtige Laenge (" + 
          gibGueltigeLaenge () + " Zeichen).");
    }
    if (!istGueltig (issn))
    {
      throw new IllegalArgumentException (
          "Die Pruefsumme stimmt nicht mit der ISSN ueberein.");
    }
    
    this.issn = issn;
  }
  
  
  /**
   * Berechnet die Pruefziffer zu einer ISSN.
   */
  private int gibBerechnetePruefziffer (long issn)
  {
    issn = issn / 10;                /* Letzte Stelle ignorieren   */
    int ergebnis = 0;
    for (int i = 2; i <= gibGueltigeLaenge (); i++)
    {
      long tmp = (long) (issn % 10);    /* Letzte Stelle merken       */
      ergebnis += tmp * i;              /* gewichteten Wert kummuliert*/
      issn = issn / 10;                 /* Letzte Stelle streichen    */
    }
    return 11 - (ergebnis % 11);        /* Differenz zu 11            */
  }

  
  /**
   * Gibt die gueltige Laenge einer ISSN zurueck.
   */
  protected int gibGueltigeLaenge ()
  {
    return 8;
  }
}
